package org.sysdance.aplicativo.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Collection;
import java.util.LinkedList;

import org.sysdance.aplicativo.entidade.Conta;
import org.sysdance.aplicativo.excecao.ConexaoException;
import org.sysdance.aplicativo.excecao.DAOException;
import org.sysdance.aplicativo.integracao.ContaIntegracao;
import org.sysdance.aplicativo.util.ConexaoUtil;
import org.sysdance.aplicativo.util.ResultSetUtil;
import org.sysdance.aplicativo.util.SysDanceUtil;
import org.sysdance.aplicativo.vo.ContaVO;

public class ContaDAO implements ContaIntegracao {

	@Override
	public void inserirConta(Conta conta)throws DAOException {
		final StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO public.conta(id_conta, id_aluno_turma_curso, vlr_parc_conta, pago, dt_venc_parc) ");
        sql.append("VALUES (NEXTVAL('conta_id_conta_seq'), ?, ?, ?,?);");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, conta.getIdAlunoTurmaCurso());
            ps.setBigDecimal(2, conta.getVlrParcConta());
            ps.setBoolean(3, Boolean.FALSE);
            ps.setDate(4, new Date(conta.getDtVencParc().getTime()));
            ps.executeUpdate();
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
            throw new DAOException(ex.getMessage());
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
            throw new DAOException(sqlex.getMessage());
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
	}
	
	@Override
	public Collection<ContaVO> consultarContas(Integer idAlunoTurmaCursoAluno) {
		final StringBuilder sql = new StringBuilder();
        sql.append("SELECT c.id_conta,c.id_aluno_turma_curso,");
        sql.append("(SELECT (SELECT a.nm_aluno FROM aluno as a WHERE a.id_aluno=atc.id_aluno) FROM aluno_turma_curso as atc WHERE atc.id_aluno_turma_curso=c.id_aluno_turma_curso)  as nm_aluno,");
        sql.append("(SELECT (SELECT t.nm_turma FROM turma as t WHERE t.id_turma=atc.id_turma) FROM aluno_turma_curso as atc WHERE atc.id_aluno_turma_curso=c.id_aluno_turma_curso)  as nm_turma,");
        sql.append("(SELECT (SELECT c.nm_curso FROM curso as c WHERE c.id_curso=atc.id_curso) FROM aluno_turma_curso as atc WHERE atc.id_aluno_turma_curso=c.id_aluno_turma_curso)  as nm_curso,");
        sql.append("c.vlr_parc_conta,c.pago	,c.dt_venc_parc ");
        sql.append("FROM conta as c WHERE c.id_aluno_turma_curso=? ORDER BY c.id_conta;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setInt(1, idAlunoTurmaCursoAluno);
            return ResultSetUtil.extrair(ps.executeQuery(), ContaVO.class);
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
        return new LinkedList<ContaVO>();
	}
	
	@Override
	public void atualizarSituacaoConta(ContaVO conta) throws DAOException {
		final StringBuilder sql = new StringBuilder();
        sql.append("UPDATE conta SET pago=? ");
        sql.append("WHERE id_conta=? AND id_aluno_turma_curso=?;");
        try {
            final Connection conexao = ConexaoUtil.criarNovaConexao();
            final PreparedStatement ps = conexao.prepareStatement(sql.toString());
            ps.setBoolean(1, conta.getPago());
            ps.setInt(2, conta.getIdConta());
            ps.setInt(3, conta.getIdAlunoTurmaCurso());
            ps.executeUpdate();
        } catch (final ConexaoException ex) {
            SysDanceUtil.getInstancia().imprimirLog(ex);
            throw new DAOException(ex.getMessage());
        } catch (final SQLException sqlex) {
            SysDanceUtil.getInstancia().imprimirLog(sqlex);
            throw new DAOException(sqlex.getMessage());
        }finally{
        	try {
				ConexaoUtil.fecharConexao();
			} catch (ConexaoException e) {
				SysDanceUtil.getInstancia().imprimirLog(e);
			}
        }
		
	}

}
